//package com.kira.scaffoldmvc.HeartBeat;
//
//import jakarta.annotation.PostConstruct;
//import jakarta.annotation.PreDestroy;
//import jakarta.annotation.Resource;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.concurrent.TimeUnit;
//import java.util.function.Supplier;
//
///**
// * 心跳管理器 - 管理业务的运行状态，与 SwitchBarrier 协同控制服务访问
// */
//@Slf4j
//@Component
//public class HeartBeanManager {
//
//
//    @Resource
//    SwitchBarrier switchBarrier;
//
//    /**
//     * 业务的心跳任务注册表
//     * Key: 业务名称
//     * Value: Pair结构，左值为业务健康检查方法，右值为业务当前状态（true=可用，false=不可用）
//     */
//    private  Map<String, Pair<Supplier<Boolean>, Boolean>> heartTaskMap = new ConcurrentHashMap<>();
//
//    public Map<String, Pair<Supplier<Boolean>, Boolean>> getHearTaskMap(){
//        return heartTaskMap;
//    }
//
//    /**
//     * 心跳异常时的阈值打印
//     * 控制异常日志输出频率，避免频繁打印
//     */
//    private final Integer HEARD_BEAN_PRINT_THRESHOLD = 6;
//
//    /**
//     * 打印日志频率阈值计数器
//     * 控制异常日志输出频率
//     */
//    private Integer printLogThresholdNum = 0;
//
//    /**
//     * 心跳检测间隔（毫秒）
//     */
//    @Value("${heartbeat.interval:5000}")
//    private long heartbeatInterval;
//
//    /**
//     * 执行手动健康检查的线程池
//     */
//    private ExecutorService executorService;
//
//    @PostConstruct
//    public void init() {
//        // 初始化线程池，用于执行手动触发的健康检查
//        executorService = Executors.newFixedThreadPool(
//                Runtime.getRuntime().availableProcessors(),
//                r -> {
//                    Thread thread = new Thread(r, "heartbeat-executor");
//                    thread.setDaemon(true);
//                    return thread;
//                }
//        );
//        log.info("HeartBeanManager 初始化完成，心跳检测间隔: {}ms", heartbeatInterval);
//    }
//
//    @PreDestroy
//    public void destroy() {
//        // 优雅关闭线程池
//        if (executorService != null) {
//            executorService.shutdown();
//            try {
//                if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
//                    executorService.shutdownNow();
//                }
//            } catch (InterruptedException e) {
//                executorService.shutdownNow();
//                Thread.currentThread().interrupt();
//            }
//        }
//        log.info("HeartBeanManager 已销毁");
//    }
//
//    /**
//     * 定时心跳检测方法 - 使用 Spring 的 @Scheduled 注解
//     */
//    @Scheduled(fixedDelayString = "${heartbeat.interval:5000}")
//    public void scheduledHeartBeat() {
//        log.trace("执行定时心跳检测...");
//        heartTaskMap.forEach((k, v) -> {
//            try {
//                // 执行健康检查，若成功则标记服务恢复
//                boolean isHealth = v.getKey().get();
//                serverRestore(k, v.getValue());
//                v.setValue(true);
//            } catch (Throwable e) {
//                // 检查失败，标记服务不可用
//                serverUnAvailable(k);
//                v.setValue(false);
//            }
//        });
//    }
//
//    /**
//     * 添加业务的心跳判断 - 注册业务但不立即执行检查
//     * @param bizName 业务名
//     * @param healthCheck 业务的心跳检测方法（返回true表示健康）
//     */
//    public void addHeartWatch(String bizName, Supplier<Boolean> healthCheck) {
//        heartTaskMap.putIfAbsent(bizName, new Pair<>(healthCheck, true));
//        log.info("注册业务心跳监控: {}", bizName);
//    }
//
//    /**
//     * 添加业务的心跳判断并立即执行检查
//     * @param bizName 业务名
//     * @param healthCheck 业务的心跳检测方法
//     */
//    public void addHeartWatchAndRun(String bizName, Supplier<Boolean> healthCheck) {
//        addHeartWatch(bizName, healthCheck);
//        // 异步执行健康检查，避免阻塞调用线程
//        executorService.submit(() -> handleRun(bizName));
//    }
//
//    /**
//     * 手动触发指定业务的健康检查
//     * @param bizName 业务名
//     */
//    public void handleRun(String bizName) {
//        if (!heartTaskMap.containsKey(bizName)) {
//            log.warn("业务 [{}] 未注册，无法执行健康检查", bizName);
//            return;
//        }
//
//        log.debug("手动触发业务 [{}] 的健康检查", bizName);
//        Pair<Supplier<Boolean>, Boolean> healthPair = heartTaskMap.get(bizName);
//        try {
//            healthPair.getKey().get();
//            serverRestore(bizName, healthPair.getValue());
//            healthPair.setValue(true);
//        } catch (Throwable e) {
//            serverUnAvailable(bizName);
//            healthPair.setValue(false);
//        }
//    }
//
//    /**
//     * 判断业务是否可用 - 通过SwitchBarrier进行状态查询
//     * @param bizName 业务名
//     * @return true：业务可用，false：业务不可用
//     */
//    public boolean isHealth(String bizName) {
//        return switchBarrier.canCross(bizName);
//    }
//
////    /**
////     * 获取所有注册的业务及其状态
////     */
////    public Map<String, Pair<Supplier<Boolean>, Boolean>> getHeartTaskMap() {
////        return heartTaskMap;
////    }
//
//    /**
//     * 处理服务恢复逻辑
//     * @param bizName 业务名
//     * @param serverAvailable 服务之前的可用状态
//     */
//    private void serverRestore(String bizName, Boolean serverAvailable) {
//        if (!serverAvailable) { // 如果之前不可用，现在恢复，记录恢复日志
//            log.info("服务【{}】心跳恢复", bizName);
//        }
//        printLogThresholdNum = 0; // 重置异常日志计数器
//        switchBarrier.allowCross(bizName); // 通过SwitchBarrier允许访问该业务
//    }
//
//    /**
//     * 处理服务不可用逻辑
//     * @param bizName 业务名
//     */
//    private void serverUnAvailable(String bizName) {
//        if (printLogThresholdNum <= 0) { // 控制异常日志输出频率
//            log.error("服务【{}】心跳异常，检查方法: {}", bizName, heartTaskMap.get(bizName).getKey());
//            printLogThresholdNum = HEARD_BEAN_PRINT_THRESHOLD;
//        } else {
//            printLogThresholdNum--; // 递减计数器，减少日志输出
//        }
//        switchBarrier.forbidCross(bizName); // 禁止访问该业务
//    }
//}